package com.daidai.testservice

import android.app.Application
import java.lang.reflect.Field
import java.lang.reflect.Proxy

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()

        val activityManagerNativeClazz = Class.forName("android.app.ActivityManagerNative")
        val gDefaultField: Field = activityManagerNativeClazz.getDeclaredField("gDefault")
        gDefaultField.setAccessible(true)
        val gDefault: Any = gDefaultField.get(null) // 获取gDefault实例，由于是静态类型的属性，所以这里直接传递null参数


// 下面通过反射执行gDefault.get();操作，最终返回IActivityManager，也就是ActivityManagerService的实例

// 下面通过反射执行gDefault.get();操作，最终返回IActivityManager，也就是ActivityManagerService的实例
        val singleTonClazz = Class.forName("android.util.Singleton")
        val mInstanceField: Field = singleTonClazz.getDeclaredField("mInstance")
        mInstanceField.setAccessible(true)
        val iActivityManager: Any = mInstanceField.get(gDefault)

        val iActivityManagerClazz = Class.forName("android.app.IActivityManager")
// 指定被代理对象的类加载器
// 指定被代理对象所实现的接口，这里就是代理IActivityManager
// 表示这个动态代理对象在调用方法的时候，会关联到哪一个InvocationHandler对象上
// 指定被代理对象的类加载器
// 指定被代理对象所实现的接口，这里就是代理IActivityManager
// 表示这个动态代理对象在调用方法的时候，会关联到哪一个InvocationHandler对象上
        val myProxy: Any = Proxy.newProxyInstance(
            Thread.currentThread().contextClassLoader,
            arrayOf(iActivityManagerClazz),
            AMSProxy(iActivityManager)
        )
        mInstanceField.set(gDefault, myProxy)
    }
}